package com.marvels.common.utils;

import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;


/**
 * 加密
 * @author one
 *
 */
public class EncryptionUtil {
	/** 加密算法RSA */ 
	 public static final String KEY_ALGORITHM = "RSA"; 

	 

	 /** 签名算法 */ 
	 public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; 

	 

	 /**RSA 最大加密明文大小*/ 
	 private static final int MAX_ENCRYPT_BLOCK = 117; 

	 /** 
	 * <p> 
	 * 公钥加密 
	 * </p> 
	 * 
	 * @param data 


	 * 源数据 
	 * @param publicKey 
	 * 公钥(BASE64 编码) 
	 * @return 
	 * @throws Exception 
	 */ 
	public static byte[] encryptByPublicKey(byte[] data, String publicKey) 
	 throws Exception { 
		 //byte[] keyBytes =  Base64.getDecoder().decode(publicKey);//Base64Utils.decode(publicKey);
		 byte[] bytes =  publicKey.getBytes(Charset.forName("ISO-8859-1"));
		 byte[] keyBytes = Base64.decodeBase64(bytes);
		//byte[] keyBytes = BASE64DecoderStream.decode(bytes);
		 //byte[] keyBytes =  Base64Utils.decode(publicKey);
		 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); 
		 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); 
		 Key publicK = keyFactory.generatePublic(x509KeySpec); 
		 // 对数据加密 
		 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 
		 cipher.init(Cipher.ENCRYPT_MODE, publicK); 
		 int inputLen = data.length; 
		 ByteArrayOutputStream out = new ByteArrayOutputStream(); 
		 int offSet = 0; 
		 byte[] cache; 
		 int i = 0; 
		 // 对数据分段加密 
		 while (inputLen - offSet > 0) { 
		 if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { 
		 cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); 
		 } else { 
		 cache = cipher.doFinal(data, offSet, inputLen - offSet); 
		 } 
		 out.write(cache, 0, cache.length); 
		 i++; 
		 offSet = i * MAX_ENCRYPT_BLOCK; 
		 } 
		 byte[] encryptedData = out.toByteArray(); 
		 out.close(); 
		 return encryptedData; 
	 } 
}
